import { IS_POINTER } from './dom';

// 阻止默认事件
export function preventDefault(evt) {
  const e = evt || window.event;
  if (e.preventDefault) {
    // W3C 阻止默认行为
    e.preventDefault();
  } else {
    // IE 阻止默认行为
    e.returnValue = false;
  }
}
// 阻止点击事件
export function preventClick(elt) {
  preventMouseDown(elt);
  preventRightClickDefault(elt);
}
// 阻止默认右键点击事件
export function preventRightClickDefault(elt) {
  elt.onmouseup = function(evt) {
    evt.preventDefault();
    if (evt.button === 2) {
      evt.preventDefault();
    }
  };
  elt.oncontextmenu = function(evt) {
    evt.preventDefault();
  };
}
// 阻止mousedown事件
export function preventMouseDown(elt) {
  if (elt) {
    elt.addEventListener(IS_POINTER ? 'pointerdown' : 'mousedown', function(evt) {
      preventDefault(evt);
    });
  }
}
// 阻止事件冒泡
export function preventPop(evt) {
  evt.stopPropagation();
}
// 从数组中删除元素
export function removeArrayElement(array, element) {
  const i = array.indexOf(element);
  if (i != -1) {
    array.splice(i, 1);
  }
}

// 添加外部点击事件
const events = [];
export function addOutClickListener(elt, listener) {
  const funct = evt => {
    if (elt.contains(evt.target)) {
      return;
    }

    if (typeof listener === 'function') {
      listener(evt);
    }

    removeOutClickListener();
  };

  const event = { element: elt, type: 'click', listener: funct };

  const removeOutClickListener = evt => {
    document.body.removeEventListener('click', funct);
    removeArrayElement(events, event);
  };

  events.forEach(evt => {
    if (!evt.element.contains(elt)) {
      evt.listener({});
    }
  });

  document.body.addEventListener('click', funct);
  events.push(event);
  return removeOutClickListener;
}
